/**
 * 将颜色字符串转换为整数表示。
 * @param {string} color - 颜色字符串，例如 '#RRGGBB' 或 '#RGB'。
 * @returns {number} 颜色的整数表示。
 */
function colorStrToInt(color) {
    let colorHex = color.slice(1);
    if (colorHex.length === 3) {
        colorHex = `${colorHex.charAt(0)}0${colorHex.charAt(1)}0${colorHex.charAt(2)}0`;
    }

    return parseInt(colorHex, 16);
}

/**
 * 将 RGB 颜色值转换为十六进制颜色字符串。
 * @param {number} r - 红色通道值，范围 0-255。
 * @param {number} g - 绿色通道值，范围 0-255。
 * @param {number} b - 蓝色通道值，范围 0-255。
 * @returns {string} 十六进制颜色字符串，例如 '#RRGGBB'。
 */
function rgbToStr(r, g, b) {
    return '#' + ((r << (8 * 2)) | (g << (8 * 1)) | (b << (8  * 0))).toString(16).padStart(6, '0');
}

/**
 * 将十六进制颜色字符串转换为 RGB 颜色值数组。
 * @param {string} color - 十六进制颜色字符串，例如 '#RRGGBB' 或 '#RGB'。
 * @returns {Array<number>} RGB 颜色值数组，格式为 [r, g, b]。
 */
function strToRgb(color) {
    const colorNum = colorStrToInt(color);
    return [
        (colorNum >> (8 * 2)) % 256,
        (colorNum >> (8 * 1)) % 256,
        (colorNum >> (8 * 0)) % 256,
    ];
}

/**
 * 将颜色的 RGB 值乘以一个因子。
 * @param {string} color - 十六进制颜色字符串，例如 '#RRGGBB' 或 '#RGB'。
 * @param {number} factor - 要乘以的因子。
 * @returns {string} 新的十六进制颜色字符串。
 */
function multiplyColor(color, factor) {
    let [r, g, b] = strToRgb(color);

    return rgbToStr(
        r * factor,
        g * factor,
        b * factor,
    );
}


/**
 * 将两个颜色的 RGB 值相加。
 * @param {string} color1 - 第一个十六进制颜色字符串，例如 '#RRGGBB' 或 '#RGB'。
 * @param {string} color2 - 第二个十六进制颜色字符串，例如 '#RRGGBB' 或 '#RGB'。
 * @returns {string} 相加后的十六进制颜色字符串。
 */
function addColors(color1, color2) {
    let [r1, g1, b1] = strToRgb(color1);
    let [r2, g2, b2] = strToRgb(color2);

    return rgbToStr(
        r1 + r2,
        g1 + g2,
        b1 + b2,
    );
}
